// 文件路径: dbms/execution/udf/FunctionRegistry.java
package com.dbms.execution.udf;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * UDF (用户自定义函数) 的注册表。
 * 这是一个在整个数据库管理系统（DBMS）中用于存储和检索用户自定义函数的中心位置。
 * 通常以单例模式使用，以确保全局只有一个函数注册实例。
 */
public class FunctionRegistry {

    // 使用 HashMap 来存储函数。键是函数名（统一转换为大写以实现不区分大小写的查找），值为实现了 Udf 接口的函数实例。
    private final Map<String, Udf> functions = new HashMap<>();

    /**
     * 注册一个新的用户自定义函数 (UDF)。
     * @param name 函数在 SQL 中被调用时的名称 (例如, "REVERSE", "UPPER")。
     * @param udf 实现了 Udf 接口的函数逻辑实例。
     */
    public void register(String name, Udf udf) {
        // 将函数名统一转换为大写作为键，这样在 SQL 调用时就可以不区分大小写 (e.g., UPPER(name) 和 upper(name) 效果相同)
        functions.put(name.toUpperCase(), udf);
    }

    /**
     * 根据函数名查找并返回一个 UDF 实例。
     * @param name 要查找的函数名。
     * @return 一个包含 UDF 实例的 Optional 对象。如果找到了函数，Optional 中会包含该函数实例；如果找不到，则返回一个空的 Optional。
     */
    public Optional<Udf> getFunction(String name) {
        // 同样，在查找时也将名称转换为大写
        return Optional.ofNullable(functions.get(name.toUpperCase()));
    }
}